
/* ********************************************************************* */
/*                                                                       */
/*                       Librairies de CC                          */
/*                                                                       */
/* ********************************************************************* */

#include "Controle.h"

/* ********************************************************************* */
/*                                                                       */
/*                        Les Fonctions                                  */
/*                                                                       */
/* ********************************************************************* */


void initCC(CC *cc, const int codeCC,const int codeUe ,const char *intitule, const float coef)
{
 	assert(cc != NULL) ;
    cc->codeUe=codeUe;
    setCodeCC(cc,codeCC);
    setIntituleDeCC(cc,intitule);
    setCoef(cc,coef);
}

CC * creCC(const int codeCC,const int codeUe,const char *intitule, const float coef)
{
	CC *cc= (CC *) calloc(1,sizeof(CC));
	initCC(cc, codeCC,codeUe, intitule, coef) ;

    return cc;
}

void libCC(CC *cc)
{
/*
	assert(cc           != NULL) ;
	assert(cc->codeCC    > 0);
    assert(cc->intitule   != NULL) ;
	assert(cc->coef!=NULL);
*/
   	cc->codeCC     = 0 ;
    cc->codeUe=0;
   	cc->intitule     = NULL;
	cc->coef  = 0;
}

void detCC(CC ** cc)
{
    assert(*cc != NULL);

    libCC(*cc);
    free(*cc);
    *cc = NULL ;
}

/* ******************************************************************** */
/*																		*/
/*           Accesseurs et Mutateurs de la structure CC           */
/*																		*/
/* ******************************************************************** */

int getCodeCC(const CC *cc)
{
    if(cc && (cc->codeCC>0))
        return cc->codeCC;
    else
        return 0;
}

void setCodeCC(CC *cc,const int codeCC)
{
    assert(codeCC>0);
    assert(cc!=NULL);
        cc->codeCC=codeCC;
}

char *getIntituleDeCC(const CC *cc)
{
    if(cc && (cc->intitule != NULL))
        return cc->intitule;
    else
        return NULL;
}

void setIntituleDeCC(CC * cc,const char * intitule)
{
    assert(intitule!=NULL);
    assert(cc!=NULL);


        /*cc->intitule=(char *)calloc(50*sizeof(char));*/
        cc->intitule=(char *)intitule;

}

float getCoef(const CC *cc)
{
    if(cc && (cc->coef != 0))
        return cc->coef;
    else
        return 0;
}

void setCoef(CC * cc,const float coef)
{
    assert(coef!=0);
    assert(cc!=NULL);

        /*cc->coef=(char *)calloc(50*sizeof(char));*/
        cc->coef=coef;

}

void affCC(const CC *cc)
{
	if(cc!=NULL && cc->intitule!=NULL && cc->coef!=0 && cc->codeCC>0)
	{
		printf("Code CC: %d\n",cc->codeCC);
		printf("Code Ue: %d\n",cc->codeUe);
		printf("Intitule CC: %s\n" ,cc->intitule);
		printf("coef CC: %f\n",cc->coef);
	}
	else
	{
		printf("\nAucun CC!!");
	}
}

/* ********************************************************************* */
/*                                                                       */
/*             Fonctions relatives aux gestiond'CC                       */
/*                                                                       */
/* ********************************************************************* */


void savCCParElem(const int codeCC,const    int codeUe,const char * intitule, const float coef)
{
    FILE* f;
    f = fopen(CC_DB, "a");/*creation du fichier s'il n'existe pas*/
    fclose(f);


    if(rchCCParCode(codeCC) == 0)
 {
        f = fopen(CC_DB, "a");
        char*cnum=calloc(20,sizeof(char));
        sprintf(cnum,"%d",codeCC);
        char*c_codeUe=calloc(10,sizeof(char));
        sprintf(c_codeUe,"%d",codeUe);
        char*chaine=calloc(50,sizeof(char));

        strcat(chaine,cnum);
        strcat(chaine,":");
         strcat(chaine,c_codeUe);
        strcat(chaine,":");
        strcat(chaine,intitule);
        strcat(chaine,":");
        char*ccoef=calloc(20,sizeof(char));
        sprintf(ccoef,"%f",coef);
        strcat(chaine,ccoef);
        strcat(chaine,"\n");

        fputs(chaine, f);
        fclose(f);
        free(cnum);
        free(c_codeUe);
        free(chaine);
        free(ccoef);
}

    else
        {printf("CC deja present dans la base de donnée!!!!!\n");

        }


}

void savCC(CC*cc)
{
    assert(cc!=NULL&&cc->codeCC>0&&cc->intitule!=NULL&&cc->coef!=0);
    savCCParElem(cc->codeCC,cc->codeUe,cc->intitule,cc->coef);
}



int rchCCParCode(const int codeCC)
{
    FILE* f;
    f=fopen(CC_DB,"a");
    fclose(f);

    f = fopen(CC_DB, "r");

    if (f==NULL)
    {
        printf("Erreur lors de l'ouverture de %s\n",CC_DB);
        exit(EXIT_FAILURE);
    }
     char* contenu=calloc(100,sizeof(char));  /* déclaration d'une chaîne qui contiendra la ligne lue*/

    while(fgets(contenu,100,f)!=NULL)
    {
        char**tab=g_strsplit((gchar*)contenu,(gchar*)":",100);
        if(codeCC == atoi(tab[0]))
        {
            fclose(f);
            free(tab);
            return 1;
        }
        free(tab);
    }
    free(contenu);

    if(!feof(f))
        printf("autre probleme \n");

    fclose(f);
    return 0;
}


CC *recCCParCode(const int codeCC)
{
    FILE* f;
    f=fopen(CC_DB,"a");
    fclose(f);

    f = fopen(CC_DB, "r");

    if (f==NULL)
    {
        printf("Erreur lors de l'ouverture de %s\n", CC_DB);
        exit(EXIT_FAILURE);
    }

     char* contenu=calloc(100,sizeof(char));  /* déclaration d'une chaîne qui contiendra la ligne lue*/

    while(fgets(contenu,100,f)!=NULL)
    {
         char**tabor=g_strsplit((gchar*)contenu,(gchar*)"\n",100);
         char**tab=g_strsplit((gchar*)tabor[0],(gchar*)":",100);

        if(codeCC == atoi(tab[0]))
        {
            fclose(f);
            free(tabor);
            free(tab);
            return creCC(atoi(tab[0]),atoi(tab[1]),tab[2],atof(tab[3]));
        }
         free(tabor);
            free(tab);
    }
    free(contenu);

    if(!feof(f))
        printf("autre probleme \n");

    fclose(f);
    return NULL;
}


int supCCParCode(const int codeCC)
{
      char *contenu=calloc(100,sizeof(char));
    FILE * fIn;
    FILE * fOut;

    if ((fIn = fopen(CC_DB, "r")) == NULL)
        return EXIT_FAILURE;

    if ((fOut = fopen("texte.tmp", "w")) == NULL)
    {
        fclose(fIn);
        return EXIT_FAILURE;
    }

    while (fgets(contenu,100, fIn))
    {
        char * ligne=calloc(100,sizeof(char));
        strcpy(ligne,contenu);
        char**tabor=g_strsplit((gchar*)contenu,(gchar*)"\n",100);
        char**tab=g_strsplit((gchar*)tabor[0],(gchar*)":",100);
        if (atoi(tab[0]) != codeCC)
                    fputs(ligne, fOut);

    free(ligne);
    free(tabor);
    free(tab);

    }
    free(contenu);

    fclose(fIn);
    fclose(fOut);

    rename("texte.tmp", CC_DB);
      return 0;
}

int supCC(CC*cc)
{
    assert(cc!=NULL);
    assert(cc->codeCC>0);
    return  supCCParCode(cc->codeCC);
}


int modifCC(CC*cc,CC*ccnew)
{
    assert(cc!=NULL);
    assert(ccnew!=NULL);
    assert(cc->codeCC>0    &&  ccnew->codeCC>0);
    assert(cc->codeCC==ccnew->codeCC);
    return  mdfCCParCode(cc->codeCC,ccnew);
}

int mdfCCParCode(const int codeCC, CC *pCC)
{
   if(supCCParCode(codeCC)==0)
   {
       savCC(pCC);
       return   0;
   }
   return   -1;
}
/** @brief recCCParCodeUe
  *
  * @todo: document this function
  */
TabCC* recCCParCodeUe(int codeUe)
{
    FILE* f;
    CC**ccs=calloc(1,sizeof(CC));
    int i=1;
    f=fopen(CC_DB,"a");
    fclose(f);

    f = fopen(CC_DB, "r");

    if (f==NULL)
    {
        printf("Erreur lors de l'ouverture de %s\n", CC_DB);
        exit(EXIT_FAILURE);
    }

     char* contenu=calloc(100,sizeof(char));  /* déclaration d'une chaîne qui contiendra la ligne lue*/

    while(fgets(contenu,100,f)!=NULL)
    {
         char**tabor=g_strsplit((gchar*)contenu,(gchar*)"\n",100);
         char**tab=g_strsplit((gchar*)tabor[0],(gchar*)":",100);

        if(codeUe == atoi(tab[1]))
        {

            ccs=realloc(ccs,sizeof(CC)*i);
            ccs[i-1]=creCC(atoi(tab[0]),atoi(tab[1]),tab[2],atof(tab[3]));
            i++;
        }
        free(tabor);
        free(tab);
    }
    free(contenu);
    if(!feof(f))
        printf("autre probleme \n");

    fclose(f);
    TabCC*tabCC=calloc(1,sizeof(TabCC));
    tabCC->tabCC=ccs;
    tabCC->nbCC=i-1;
    return tabCC;
}

/** @brief recCCParUe
  *
  * @todo: document this function
  */
TabCC* recCCParUe(UE*ue)
{
    assert(ue!=NULL);
    return  recCCParCodeUe(ue->codeUE);
}



void affCC_DB()
{
    FILE* f;

   f = fopen(CC_DB, "r");

    if (f==NULL)
        {
        printf("Erreur lors de l'ouverture de %s\n", CC_DB);
        exit(EXIT_FAILURE);
        }
    char*contenu=calloc(100,sizeof(char));
    while(fgets(contenu,100,f) != NULL)
        {
        char**tabor=g_strsplit((gchar*)contenu,(gchar*)"\n",100);
        char**tab=g_strsplit((gchar*)tabor[0],(gchar*)":",100);
        affCC(creCC(atoi(tab[0]),atoi(tab[1]),tab[2],atof(tab[3])));
        free(tabor);
        free(tab);
        }
        free(contenu);

    if(!feof(f))
        printf("autre probleme \n");
    fclose(f);
}

/* ********************************************************************* */


void regCC()
{

}

